package main.od;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;
public class ArrTree {
//        0 1 2  3  4 5 6
//        3 5 7 -1 -1 2 4
//
//             3
//         5       7
//      -1  -1   2   4
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 数组的内容，数组的每个元素都是正整数，元素间用空格分割
        Integer[] arr = Arrays.stream(sc.nextLine().split(" "))
                .map(Integer::parseInt).toArray(Integer[]::new);
        int n = arr.length - 1;
        // 最小叶子节点的值
        int min = Integer.MAX_VALUE;
        // 最小叶子节点的索引
        int minIndex = -1;
        // 求解最小叶子节点的值和索引
        for (int i = n; i >= 1; i--) {
            if (arr[i] != -1) {
                if (i * 2 + 1 <= n && arr[i * 2 + 1] != -1) {
                    continue;
                }
                if (i * 2 + 2 <= n && arr[i * 2 + 2] != -1) {
                    continue;
                }
                // 解最小叶子节点
                if (min > arr[i]) {
                    min = arr[i];
                    minIndex = i;
                }
            }
        }
        // 最小叶子节点到根的路径
        LinkedList<Integer> pathList = new LinkedList<>();
        pathList.addFirst(min);
        // 从最小叶子节点开始向上找父节点，直到树顶
        while (minIndex != 0) {
            int temp = (minIndex - 1) / 2;
            pathList.addFirst(arr[temp]);
            minIndex = temp;
        }
        // 输出从根节点到最小叶子节点的路径上，各个节点的值，由空格分割
        StringBuilder builder = new StringBuilder();
        for (int value :pathList) {
            builder.append(value).append(" ");
        }
        System.out.println(builder.substring(0,builder.length() - 1));
    }
}
